Skip to content

Add Module for Normal Everkeep#722

Closed
gadeleon wants to merge 41 commits into
awgil:masterfrom
gadeleon:t03-everkeep
Closed

Add Module for Normal Everkeep#722
gadeleon wants to merge 41 commits into
awgil:masterfrom
gadeleon:t03-everkeep

Conversation

@gadeleon
Copy link
Copy Markdown

(This is my first attempt at a module and should definitely be squashed if pulled.)

Adds support for Normal Everkeep for Duty Support.

Tested as:

  • GNB
  • WHM
  • BLM
  • BRD
  • SAM

Zero hits on all runs.

Open to feedback to make this better!

Gabriel Deleon added 30 commits April 17, 2026 12:27
Each 42AA Fang does 10 sprint segments (5 inward, 5 outward). The rect
AOE follows the fang's sprint path: from its current position to the
sprint endpoint (carried in the cast's TargetPos/LocXZ).

- Initial sprint (38183, instant): halfwidth 4 + back extension 3 so the
  four outer-perimeter rects tile the diamond flush at the corners.
- Subsequent sprints (37711, 0.7s): halfwidth 2.5 + front 1.5 + back 2
  so the four arms form a pinwheel without overlapping at corners.

Rects are tracked per fang InstanceID; a new cast replaces the previous
rect, and entries auto-expire shortly after each sprint would complete.
Dawn of an Age's raidwide collapses the platform to a 20x20 center square
for the Chasm of Vollok + Forged Track sequence; Actualize restores the
full 40x40 diamond when that sequence ends. Both casts fire twice per
fight, so the arena cycles small - normal - small - normal.

Mirrors the NormalBounds / SmallBounds pattern from Ex2ZoraalJa.
The P2 boss actor is destroyed and re-spawned (same OID, new InstanceID)
during the big arena transition. The old phase-2 end condition treated a
missing BossP2 as 'defeated' via ?? true on the null-conditional IsDead
check, which unloaded the module during the ~0.4s swap gap.

- BossP2() now queries dynamically for any non-destroyed actor with
  OID.BossP2, so the new instance is picked up automatically.
- Phase 2 only ends when a BossP2 is actually dead (HP = 0). A missing
  BossP2 keeps the phase running via ?? false.
After the Gateway/BladeWarp setup, Fangs at the outer intercardinal
platforms cast ForgedTrackPreview (37729, 11.6s, 0-hit telegraph).
Actual damage comes from separate instant-cast Fangs at inner positions
(37730), along lanes parallel to — but offset from — the preview lanes.

The perpendicular offset follows a rotation/Gateway-sign rule:
- NE-SW diagonal previews (rot -45° or +135°, dir.X * dir.Z < 0): damage
  lane offset by sign(Gateway) * 5 perpendicular-left.
- NW-SE diagonal previews (rot +45° or -135°): no offset, damage lane
  matches preview lane.

Origin is shifted 30 forward from the preview caster so the rect sits
inside the shrunken arena where the damage actually lands. Rect is
1-cell wide (halfwidth 2.5) by 4-cells long (20 forward) per the mech's
4-lane cross-arena layout.
Icon 376 appears on all 8 party members simultaneously as a ~5s warning,
then 8 helpers instant-cast Fire III (37752) one per target. Standard
SpreadFromIcon with 5-unit radius matches the per-player spread circle.
Duty's Edge fires 4 line-stack AOEs (37750) ~2.1s apart after the
target icon (35567) picks a player. My old code set GenericWildCharge's
Source on the target cast but never cleared it, so the rect rendering
persisted long after the mechanic resolved.

Track hit count per instance: increment on each AOE event, clear Source
once NumCasts >= 4 so the component stops rendering. Reset NumCasts on
each new target icon so the second Duty's Edge instance fires its own
4-count cleanly.
…na edge

Cast target positions sit at the back corner of each 5x5 grid cell,
so a centered 5x5 rect covered only half the expected cell. Changed
shape from AOEShapeRect(2.5, 2.5, 2.5) (centered) to AOEShapeRect(5, 2.5)
(5 forward + 0 back) — same size, but origin at the rect's back edge.
The SE-most rect now extends its outer corner to the arena's S diamond
tip.
@xanunderscore
Copy link
Copy Markdown
Collaborator

Will try to get this merged after I update the plugin for 7.5, which is blocked on a staging release of Dalamud. Thanks for the PR

@xanunderscore
Copy link
Copy Markdown
Collaborator

Ok finally getting to it now lel

@@ -0,0 +1,3 @@
namespace BossMod.Dawntrail.Trial.T03Everkeep;

class BitterReaping(BossModule module) : Components.SingleTargetCast(module, AID.BitterReapingAOE, "Tank busters");
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For components that are a single line, feel free to just put them in the root module file (T03Everkeep), creating separate files for simple components is more trouble than it's worth I feel (I will merge this as-is though)


// Spread on icon 376; 8 helpers instant-cast Fire III (37752) ~5s later. Forbidden radius is 7m
// (2m wider than the 5m hit) so the AI doesn't clip a neighbor while routing.
class FireIII(BossModule module) : Components.SpreadFromIcon(module, 376, AID.FireIII, 7f, 5.1f)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GenericStackSpread already has an extra spread threshold for AI (in this case 1 unit) so the extra size here should be unnecessary

@xanunderscore
Copy link
Copy Markdown
Collaborator

Merged in 275db97

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants